import { Injectable } from '@angular/core';

// 引入 Prism.js 核心和常用语言
import * as Prism from 'prismjs';
import 'prismjs/components/prism-typescript';
import 'prismjs/components/prism-javascript';
import 'prismjs/components/prism-css';
import 'prismjs/components/prism-scss';
import 'prismjs/components/prism-json';
import 'prismjs/components/prism-markdown';
import 'prismjs/components/prism-bash';
import 'prismjs/components/prism-python';
import 'prismjs/components/prism-java';

@Injectable({
  providedIn: 'root'
})
export class SyntaxHighlightService {

  constructor() { }

  /**
   * 对代码进行语法高亮
   * @param code 要高亮的代码
   * @param language 编程语言
   * @returns 高亮后的HTML字符串
   */
  highlightCode(code: string, language: string): string {
    try {
      // 将常见的语言名称映射到 Prism.js 支持的语言
      const languageMap: { [key: string]: string } = {
        'typescript': 'typescript',
        'ts': 'typescript',
        'javascript': 'javascript',
        'js': 'javascript',
        'html': 'markup',
        'xml': 'markup',
        'css': 'css',
        'scss': 'scss',
        'sass': 'scss',
        'json': 'json',
        'markdown': 'markdown',
        'md': 'markdown',
        'bash': 'bash',
        'shell': 'bash',
        'sh': 'bash',
        'python': 'python',
        'py': 'python',
        'java': 'java'
      };

      const prismLanguage = languageMap[language.toLowerCase()] || 'typescript';
      
      // 确保Prism对象存在
      if (!Prism || !Prism.languages) {
        console.warn('Prism.js 未正确加载');
        return this.escapeHtml(code);
      }

      // 检查语言是否被加载
      if (Prism.languages[prismLanguage]) {
        const highlightedCode = Prism.highlight(code, Prism.languages[prismLanguage], prismLanguage);
        console.log(`语法高亮成功: ${prismLanguage}`, highlightedCode.substring(0, 100) + '...');
        return highlightedCode;
      } else {
        console.warn(`语言 ${prismLanguage} 不支持，可用语言:`, Object.keys(Prism.languages));
        // 如果语言不支持，返回原始代码（使用基本的HTML转义）
        return this.escapeHtml(code);
      }
    } catch (error) {
      console.error('语法高亮失败:', error);
      return this.escapeHtml(code);
    }
  }

  /**
   * 转义HTML特殊字符
   * @param text 要转义的文本
   * @returns 转义后的文本
   */
  private escapeHtml(text: string): string {
    const div = document.createElement('div');
    div.textContent = text;
    return div.innerHTML;
  }

  /**
   * 检查是否支持指定语言
   * @param language 语言名称
   * @returns 是否支持
   */
  isSupportedLanguage(language: string): boolean {
    const supportedLanguages = [
      'typescript', 'ts', 'javascript', 'js', 'html', 'xml',
      'css', 'scss', 'sass', 'json', 'markdown', 'md',
      'bash', 'shell', 'sh', 'python', 'py', 'java'
    ];
    return supportedLanguages.includes(language.toLowerCase());
  }

  /**
   * 获取所有支持的语言列表
   * @returns 支持的语言列表
   */
  getSupportedLanguages(): string[] {
    return [
      'typescript', 'javascript', 'html', 'css', 'scss', 
      'json', 'markdown', 'bash', 'python', 'java'
    ];
  }
} 